package pe.com.empresa.web.actions.ventas;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pe.com.empresa.datos.dominio.Comprobante;
import pe.com.empresa.datos.dominio.ComprobanteArticulo;
import pe.com.empresa.datos.dominio.ComprobantePago;
import pe.com.empresa.datos.dominio.ConsultaListaKardexPorArticulo;
import pe.com.empresa.datos.dominio.ConsultaListaKardexPorArticuloCriteria;
import pe.com.empresa.datos.dominio.Kardex;
import pe.com.empresa.utiles.ActionHelper;
import pe.com.empresa.utiles.Constantes;
import pe.com.empresa.utiles.EstadoOperacion;
import pe.com.empresa.utiles.GrillaArticulos;
import pe.com.empresa.utiles.KardexUtil;
import pe.com.empresa.utiles.SecuenciaUtil;
import pe.com.empresa.utiles.ServiceHelper;

public class GenerarComprobantePagoAction extends ActionHelper {

	private static final long serialVersionUID = -4156610596918935934L;
	
	private Integer idPersona;
	private Integer tipoComprobante;
	
	private EstadoOperacion estadoOperacion = new EstadoOperacion();
	
	private ServiceHelper service = new ServiceHelper();
	
	public GenerarComprobantePagoAction() {
		// TODO Auto-generated constructor stub
		service.setSqlSessionFactory(this.getSqlSessionFactory());
	}
	
	public String grabrarComprobantePago(){
		
		try {
			
			List<GrillaArticulos> grilla = (List<GrillaArticulos>) this.getSessionContext().getAttribute(Constantes.SESION_GRILLA_ARTICULOS);
			
			if(grilla != null && !grilla.isEmpty()){
				
				service.openSession();
				
				String secuencia = SecuenciaUtil.obtenerSecuencia(Constantes.TABLA_COMPROBANTE_PAGO, service.getSession());
				Comprobante comprobante = new Comprobante();
				comprobante.setTipo_comprobante(2);
				comprobante.setNumeroComprobante(secuencia);
				comprobante.setFechaRegistro(new Date());
				comprobante.setEstado(1);
				
				service.insertar(comprobante);
				
				ComprobantePago comprobantePago = new ComprobantePago();
				comprobantePago.setIdTercero(idPersona);
				comprobantePago.setTipo_comprobante_pago(tipoComprobante);
				comprobantePago.setNumeroComprobante(secuencia);
				
				service.insertar(comprobantePago);
				
				for(GrillaArticulos a : grilla){
					ComprobanteArticulo articulo = new ComprobanteArticulo();
					articulo.setNumeroComprobante(secuencia);
					articulo.setCodigoArticulo(a.getCodigoArticulo());
					articulo.setPrecioVenta(a.getPrecio());
					articulo.setPrecioUnitario(new BigDecimal(0));
					articulo.setCantidadArticulo(a.getCantidadArticulo());
					service.insertar(articulo);
					
				//	ConsultaListaKardexPorArticulo ultimoSaldo = 
					
					ConsultaListaKardexPorArticuloCriteria criteria = new ConsultaListaKardexPorArticuloCriteria();
					criteria.setCodigoArticulo(a.getCodigoArticulo());
					List<ConsultaListaKardexPorArticulo> listKardex = service.selectByCriteria("ConsultaListaKardexPorArticulo", criteria);
					if(!listKardex.isEmpty()){
						
						List<KardexUtil> listaSaldos = this.calcularSaldos(listKardex);
						KardexUtil ultimoSaldo = listaSaldos.get(listaSaldos.size()-1);
						
						Kardex kardex = new Kardex();
						kardex.setNumeroComprobante(secuencia);
						kardex.setCodigoArticulo(ultimoSaldo.getCodigoArticulo());
						kardex.setTipo_movimiento(Constantes.TIPO_MOVIMIENTO_SALIDA_VENTA);
						kardex.setCantidadArticulo(a.getCantidadArticulo());
						kardex.setValorUnitario(ultimoSaldo.getValorUnitarioExistencia());
						kardex.setEstado(1);
						kardex.setFechaRegistro(new Date());
						
						service.insertar(kardex);
					}
									
				}
				
				service.commit();
				estadoOperacion.setEstadoOperacion(Constantes.OP_SUCCESS);
				estadoOperacion.setMensajeEstado("El comprobante de pago se registro con exito, numero de comprobante generado: ." +secuencia);
				
				service.closeSession();
				
			}else{
				estadoOperacion.setEstadoOperacion(Constantes.OP_EXCEPTION);
				estadoOperacion.setMensajeEstado("Error, Necesita tener como minimo un item en la grilla de articulos.");
				service.rollback();
			}

			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return SUCCESS;
	}


	public Integer getTipoComprobante() {
		return tipoComprobante;
	}

	public void setTipoComprobante(Integer tipoComprobante) {
		this.tipoComprobante = tipoComprobante;
	}


	public Integer getIdPersona() {
		return idPersona;
	}


	public void setIdPersona(Integer idPersona) {
		this.idPersona = idPersona;
	}

	public EstadoOperacion getEstadoOperacion() {
		return estadoOperacion;
	}

	public void setEstadoOperacion(EstadoOperacion estadoOperacion) {
		this.estadoOperacion = estadoOperacion;
	}
	public List<KardexUtil> calcularSaldos(List<ConsultaListaKardexPorArticulo> list){
		List<KardexUtil> listKardexUtil = new ArrayList<KardexUtil>(); 
		
		for(ConsultaListaKardexPorArticulo k : list){
			
			KardexUtil kardex = new KardexUtil();
				
			kardex.setCodigoArticulo(k.getCodigoArticulo());
			
			
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_ENTRADA_COMPRA)){
				
				kardex.setCantidadArticuloEntrada(k.getCantidadArticulo());
				kardex.setValorUnitarioEntrada(k.getValorUnitario());
				kardex.setValorTotalEntrada(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo().intValue() + util.getCantidadArticuloExistencia().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() + kardex.getValorTotalEntrada().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
				
			}
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_ENTRADA_DEVOLUCION)){
				
				kardex.setCantidadArticuloEntrada(k.getCantidadArticulo().intValue());
				kardex.setValorUnitarioEntrada(k.getValorUnitario());
				kardex.setValorTotalEntrada(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo().intValue() + util.getCantidadArticuloExistencia().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() + kardex.getValorTotalEntrada().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
			}
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_SALIDA_VENTA)){
				
				kardex.setCantidadArticuloSalida(k.getCantidadArticulo());
				kardex.setValorUnitarioSalida(k.getValorUnitario());
				kardex.setValorTotalSalida(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(util.getCantidadArticuloExistencia().intValue() - k.getCantidadArticulo().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() - kardex.getValorTotalSalida().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
			}
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_SALIDA_DEVOLUCION)){
				
				kardex.setCantidadArticuloSalida(k.getCantidadArticulo().intValue());
				kardex.setValorUnitarioSalida(k.getValorUnitario());
				kardex.setValorTotalSalida(new BigDecimal(kardex.getCantidadArticuloSalida().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(util.getCantidadArticuloExistencia().intValue() - k.getCantidadArticulo().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() - kardex.getValorTotalSalida().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
			}
			kardex.setTipo_movimiento(k.getTipo_movimiento());
			listKardexUtil.add(kardex);
			
		}
		return listKardexUtil;
	}
}
